﻿// test_class_constructor.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
using namespace std;

class MyClass
{
public:
    MyClass()
        //2 构造函数的成员初始化列表
        :begin_{2},
        name_{"myclass"}
    {
        name_ = name_ + to_string(index_);
        cout << "Create MyClass" << index()<<" " << name_ << endl;
    }
    ~MyClass()
    {
        cout << "Drop MyClass" << index() << endl;
    }
    int index() { return index_; }
    void set_index(int i) { index_ = i; }
private:
    //不要开放任何成员变量到public
    //默认成员初始化器
    string name_;
    int begin_{ 1 };
    int index_{ begin_+count_++ };
    static int count_;
};

int MyClass::count_{ 0 };


/// <summary>
// 栈区构造析构测试
/// </summary>
//MyClass mcg; //全局对象在进main函数之前调用
int main()
{
    cout << "begin main" << endl;
    {
        MyClass mcarr[3];
    }

    //堆区 动态内存构造析构测试
    /*
    cout << "堆区 动态内存构造析构测试" << endl;
    {
        //创建动态对象
        MyClass* mcp1 = new MyClass();
        delete mcp1; //调用析构函数
        mcp1 = nullptr;
        delete mcp1; //delete nullptr没有问题

        auto mcp2 = new MyClass; //内存泄漏
    }
    */
    /*
    cout << "begin main" << endl;
    static MyClass mcs;
    {
        MyClass mc1;
        getchar();
    }
    getchar();
    */
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
